package com.xuzmian.demo.kotlin

import javax.inject.Inject

class AttributesAndField {
    var name: String = "Holmes, Sherlock"

    var canBeNullValue: String? = null

    /**
     * 自定义的 setter,将字符串去掉空格
     */
    var stringRepresentation: String
        get() = this.toString()
        set(value) {
            if (value.isNotBlank()) value.trimMargin() else value
        }

    val isEmpty: Boolean?
        get() = canBeNullValue?.isEmpty()

    var setterVisibility: String = "abc"
        private set // 此 setter 是私有的并且有默认实现

    // 用 Inject 注解此 setter
    var setterWithAnnotation: Any? = null
        @Inject set

    /**
     * 幕后字段:在 Kotlin 类中不能直接声明字段。然而，当一个属性需要一个幕后字段时，Kotlin 会自动提供。这个幕后字段可以使用field标识符在访问器中引用
     */
    var counter = 0 // 注意：这个初始器直接为幕后字段赋值
        set(value) {
            if (value >= 0) field = value
        }

    /**
     * 幕后属性:可用自定义的字段当作幕后字段
     */
    private var _table: Map<String, Int>? = null
    public val table: Map<String, Int>
        get() {
            if (_table == null) {
                _table = HashMap() // 类型参数已推断出
            }
            return _table ?: throw AssertionError("Set to null by another thread")
        }
}